home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac-Source 1994 July
/
Mac-Source_July_1994.iso
/
C and C++
/
Commun⁄Network
/
MailCheck 0.9x ƒ
/
drvr src
/
mmc_drvr.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-08-06
|
4KB
|
257 lines
/*
* MacMailWatch driver
* By Aaron Wohl (aw0g+@andrew.cmu.edu)
* Carnegie-Mellon University
* Pittsburgh, PA 15213-3890
* (412)-268-5032
*/
#define jIODone 0x8fc
void o_glue(void);
void c_glue(void);
void p_glue(void);
void s_glue(void);
void cntrl_glue(void);
void header(void);
void header()
{
/* do NOT add or subtract any fields */
asm {
DC.W dNeedLock|dCtlEnable|dNeedTime /* drvrFlags */
DC.W 60*3 /* drvrDelay */
DC.W updateEvt /* drvrEMask */
DC.W 0 /* drvrMenu */
DC.W 42 /* open */
DC.W 48 /* prime */
DC.W 54 /* control */
DC.W 66 /* status */
DC.W 60 /* close */
dc.b "\p.MacMailCheck"
DC.L 0 /* storage for a4 (offset 24) */
dc.l 0
}
}
/* do not modify */
void open_code(void);
void open_code()
{
asm {
bra o_glue
}
}
/* do not modify */
void prime_code(void);
void prime_code()
{
asm {
bra p_glue
}
}
/* do not modify */
void control(void);
void control() {
asm {
bra cntrl_glue
}
}
/* do not modify */
void close_code(void);
void close_code() {
asm {
bra c_glue
}
}
/* do not modify */
void status_code(void);
void status_code()
{
asm {
bra s_glue
}
}
#include "mmc_core.h"
#include "mmc_core_private.h"
int mmc_control(mmc_io_record_pt pb);
LDEF(void cached_strip_mask(void))
{
asm {
dc.l 0
dc.b 0
}
}
LDEF(void clear_strip(void))
{
asm {
lea cached_strip_mask,a0
clr.l (a0)
clr.b 4(a0)
rts
}
}
LDEF(void set_strip_mask(void))
{
asm {
move.l #-1,d0
_StripAddress
lea cached_strip_mask,a0
move.l d0,(a0)
move.b #255,4(a0)
rts
}
}
LDEF(void strip_all(void))
{
asm {
lea cached_strip_mask,a0
tst.b 4(a0)
bne.s @know_strip
bsr set_strip_mask
know_strip:
lea cached_strip_mask,a0
move.l (a0),d0
and.l d0,(sp)
move.l a4,d1
and.l d0,d1
move.l d1,a4
rts
}
}
void driver_exit_func(void);
void driver_exit_func()
{
asm {
move.w d0,OFFSET(CntrlParam,ioResult)(a0)
btst #1,OFFSET(mmc_io_record,ioTrap)(a0) /*is this a queued call? */
bne.s @notqueued
move.l jIODone,-(sp)
notqueued:
rts
}
}
/* glue for close*/
void c_glue()
{
asm {
move.l a1,-(sp) /*a1=dce*/
move.l a4,-(sp)
lea header,a4
move.l a0,-(sp)
jsr strip_all
jsr mmc_uninit
jsr clear_strip
move.l (sp)+,a0
move.l (sp)+,a4
move.l (sp)+,a1 /*a1=dce for jiodone*/
clr.l d0
bra driver_exit_func
}
}
/* glue for open*/
void o_glue()
{
asm {
move.l a1,-(sp) /*a1=dce*/
move.l a4,-(sp)
lea header,a4
move.l a0,-(sp)
jsr strip_all
jsr mmc_init
move.l (sp)+,a0
move.l (sp)+,a4
move.l (sp)+,a1 /*a1=dce for jiodone*/
bra driver_exit_func
}
}
/*prime*/
void p_glue()
{
asm {
move.l #-19,d0
bra driver_exit_func
}
}
/*status*/
void s_glue()
{
asm {
move.l #-18,d0
bra driver_exit_func
}
}
/* glue for control*/
void cntrl_glue()
{
asm {
move.l a1,-(sp) /*a1=dce*/
move.l a4,-(sp)
lea header,a4
move.l a0,-(sp)
move.l a0,-(sp)
jsr strip_all
jsr mmc_control
addq.l #4,sp
move.l (sp)+,a0
move.l (sp)+,a4
move.l (sp)+,a1 /*a1=dce for jiodone*/
bra driver_exit_func
}
}
int mmc_control(mmc_io_record_pt pb)
{
int err=0;
int err1;
switch(pb->csCode) {
case MMC_setmmuser:
return mmc_setmmuser(&pb->iostate,(mmc_priv_state_pt *)&pb->private_state);
case MMC_set_state:
{ err=mmc_set_state(&pb->iostate);
if(err==MMCE_bad_maj) /*if version are bad can't return state*/
return err; /*it might trash something*/
err1=mmc_get_state(&pb->iostate,(mmc_priv_state_pt *)&pb->private_state);
if(err!=0)
return err1;
else
return err;
}
case MMC_get_state:
return mmc_get_state(&pb->iostate,(mmc_priv_state_pt *)&pb->private_state);
break;
case MMC_run:
mmc_tick();
break;
case MMC_goodbye:
case MMC_killio:
break;
default:
return -17; /*don't like this control call*/
}
return noErr;
}
void main()
{
}